//给你一个整数数组 nums ，请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同，请你按照数值本身将它们 降序 排序。 
//
// 请你返回排序后的数组。 
//
// 
//
// 示例 1： 
//
// 输入：nums = [1,1,2,2,2,3]
//输出：[3,1,1,2,2,2]
//解释：'3' 频率为 1，'1' 频率为 2，'2' 频率为 3 。
// 
//
// 示例 2： 
//
// 输入：nums = [2,3,1,3,2]
//输出：[1,3,3,2,2]
//解释：'2' 和 '3' 频率都为 2 ，所以它们之间按照数值本身降序排序。
// 
//
// 示例 3： 
//
// 输入：nums = [-1,1,-6,4,5,-6,1,4,1]
//输出：[5,-1,4,4,-6,-6,1,1,1] 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 100 
// -100 <= nums[i] <= 100 
// 
// Related Topics数组 | 哈希表 | 排序 
//
// 👍 66, 👎 0 
//
//
//
//

package leetcode.editor.day;

import java.util.*;

// 1636. 按照频率将数组升序排序
// https://leetcode.cn/problems/sort-array-by-increasing-frequency/submissions/
class SortArrayByIncreasingFrequency {
    public static void main(String[] args) {
        Solution solution = new SortArrayByIncreasingFrequency().new Solution();
        solution.frequencySort(new int[]{-3});
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        // 保存频率对应关系
        /*public int[] frequencySort(int[] nums) {
            Map<Integer, List<Integer>> freqMap = new HashMap<>();
            Map<Integer, Integer> map = new HashMap<>();
            for (int num : nums) {
                map.put(num, map.getOrDefault(num, 0) + 1);
            }

            for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
                int freq = entry.getValue();
                int val = entry.getKey();
                freqMap.putIfAbsent(freq, new LinkedList<>());
                freqMap.get(freq).add(val);
            }

            int[] res = new int[nums.length];
            int i = 0;
            for (int j = 0; j <= nums.length; j++) {
                if (freqMap.containsKey(j)) {
                    List<Integer> list = freqMap.get(j);
                    Collections.sort(list, ((o1, o2) -> o2 - o1));
                    for (int k = 0; k < list.size(); k++) {
                        for (int l = 0; l < j; l++) {
                            res[i++] = list.get(k);
                        }
                    }
                }
            }

            return res;
        }*/

        public int[] frequencySort(int[] nums) {
            Map<Integer, Integer> map = new HashMap<>();
            for (int num : nums) {
                map.put(num, map.getOrDefault(num, 0) + 1);
            }

            List<Integer> list = new ArrayList<>();
            for (int num : nums) {
                list.add(num);
            }

            Collections.sort(list, (o1, o2) -> {
                // 获取频率
                int a = map.get(o1), b = map.get(o2);
                // 相同降序，不相同按照频率升序
                return a == b ? o2 - o1 : a - b;
            });

            int[] res = new int[list.size()];
            for (int i = 0; i < res.length; i++) {
                res[i] = list.get(i);
            }

            return res;
        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}
